
#include "../inc/show_demo.h"
#include "../inc/show_dir_demo.h"

// bool exit_flag = false;

/* lvgl控件测试*/

// 初始界面显示
bool show_demo()
{
    // 创建一个画布(默认屏幕大小，白色)
    lv_obj_t *main_windows = lv_obj_create(NULL);

    // 图片显示
    show_jpg_demo(main_windows);

    // 按钮显示
    show_btn_demo(main_windows);

    // 开关显示
    show_switch_demo(main_windows);

    // gif显示
    show_gif_demo(main_windows);

    // 进度条
    show_bar_demo(main_windows);

    // 滑动条
    show_slider_demo(main_windows);

    // 下拉列表
    show_downList_demo(main_windows);

    // 复选框
    show_checkbox_demo(main_windows);

    // 线段
    show_line_demo(main_windows);

    // 弧线
    // show_arc_demo(main_windows);

    // 文本框
    show_textarea_demo(main_windows);

    // 中文文本显示
    show_label_demo(main_windows);
    show_label_demo2(main_windows);

    // 滚轮
    show_roller_demo(main_windows);

    // 列表
    show_list_demo(main_windows);

    // 加载到屏幕
    lv_scr_load(main_windows);

    return true;
}

// gif
bool show_gif_demo(lv_obj_t *main_windows)
{
    // 创建一个gif对象
    lv_obj_t *gif_obj = lv_gif_create(main_windows);

    // 设置gif对象路径
    lv_gif_set_src(gif_obj, "S:/mdata/gif/yasuo.gif");

    // 设置gif对象位置
    lv_obj_align(gif_obj, LV_ALIGN_CENTER, 0, -138);

    return true;
}

// 图片
bool show_jpg_demo(lv_obj_t *main_windows)
{

    lv_obj_t *img_obj = lv_img_create(main_windows);

    // 图片路径
    lv_img_set_src(img_obj, "S:/mdata/jpg/yasuo.png");

    // 设置图片位置(左下角)
    lv_obj_set_pos(img_obj, 0, 300);
    // lv_obj_align(img_obj, LV_ALIGN_BOTTOM_LEFT, 0, 0);

    return true;
}

// 按钮
bool show_btn_demo(lv_obj_t *main_windows)
{

    lv_obj_t *btn_obj = lv_btn_create(main_windows);

    // 设置按下状态字体颜色
    lv_obj_set_style_text_color(btn_obj, lv_color_make(0, 0, 0), LV_STATE_PRESSED);

    // 设置默认状态字体大小
    // lv_obj_set_style_text_font(btn_obj, &lv_font_montserrat_24, 0);

    // 设置按钮可被选中
    lv_obj_add_flag(btn_obj, LV_OBJ_FLAG_CHECKABLE);

    // 设置按钮大小
    lv_obj_set_size(btn_obj, 120, 70);

    // 设置按钮位置
    lv_obj_align(btn_obj, LV_ALIGN_CENTER, 0, 180);

    /*  设置按钮的标签对象  */
    // 创建一个label对象
    lv_obj_t *label_obj = lv_label_create(btn_obj);

    // 设置文字
    lv_label_set_text(label_obj, "Button");

    // 居中对齐标签
    lv_obj_center(label_obj);

    return true;
}

// 更新进度条值的回调函数
void set_temp(void *bar, int32_t temp)
{
    // 将进度条的值设置为传入的值，并开启动画效果
    lv_bar_set_value(bar, temp, LV_ANIM_ON);
}

// 进度条及动画
bool show_bar_demo(lv_obj_t *main_windows)
{
    lv_obj_t *bar_obj = lv_bar_create(main_windows); // 创建一个进度条对象

    lv_obj_set_size(bar_obj, 20, 200); // 设置进度条大小

    lv_obj_align(bar_obj, LV_ALIGN_CENTER, 200, -127);

    lv_bar_set_range(bar_obj, 0, 100); // 设置进度条范围

    // lv_bar_set_value(bar_obj, 70, LV_ANIM_OFF); // 设置进度条值,关闭动画效果

    // 初始化动画对象
    lv_anim_t a;
    lv_anim_init(&a);

    // 设置动画的执行回调函数
    lv_anim_set_exec_cb(&a, set_temp);

    // 设置动画的持续时间为3000毫秒
    lv_anim_set_time(&a, 6000);
    // 设置动画的回放时间为3000毫秒
    lv_anim_set_playback_time(&a, 6000);

    // 设置动画操作的变量
    lv_anim_set_var(&a, bar_obj);

    // 设置动画的开始和结束值
    lv_anim_set_values(&a, 0, 100);

    // 设置动画无限循环
    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);

    // 启动动画
    lv_anim_start(&a);

    return true;
}

// 滑动条
bool show_slider_demo(lv_obj_t *main_windows)
{
    lv_obj_t *slider_obj = lv_slider_create(main_windows); // 创建一个滑动条对象

    lv_obj_center(slider_obj); // 居中

    // 绑定事件
    lv_obj_add_event_cb(slider_obj, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);

    // 创建一个标签
    slider_label = lv_label_create(slider_obj);
    lv_label_set_text(slider_label, "0%"); // 初始文本为0%
    // 设置字体默认颜色为黑色
    lv_obj_set_style_text_color(slider_label, lv_color_make(0, 0, 0), LV_STATE_DEFAULT);

    // 设置标签位置
    lv_obj_align_to(slider_label, slider_obj, LV_ALIGN_OUT_BOTTOM_MID, 0, -15);

    return true;
}

// 滑动条事件回调函数(更新滑动条标签值)
void slider_event_cb(lv_event_t *e)
{
    // 获取滑动条对象
    lv_obj_t *slider = lv_event_get_target(e);

    char buf[8];
    // 将滑动条的值转换为字符串
    lv_snprintf(buf, sizeof(buf), "%d%%", (int)lv_slider_get_value(slider));
    lv_label_set_text(slider_label, buf);
    // 设置标签位置
    lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, -15);

    static const char *btns[] = {"Apply", "Close", NULL}; // 提示框按钮

    // 当滑动条值到100%
    if (lv_slider_get_value(slider) == 100)
    {
        // 创建一个提示框对象
        lv_obj_t *alert_obj = lv_msgbox_create(lv_scr_act(), "prompt", "Arrived 100% !", btns, true);
        lv_obj_align(alert_obj, LV_ALIGN_CENTER, 0, 0);
    }
}

// 开关
bool show_switch_demo(lv_obj_t *main_windows)
{
    // 创建一个开关
    lv_obj_t *swtich_obj = lv_switch_create(main_windows);

    lv_obj_align(swtich_obj, LV_ALIGN_CENTER, 270, -210); // 位置

    return true;
}

// 下拉列表
bool show_downList_demo(lv_obj_t *main_windows)
{

    lv_obj_t *list_obj = lv_dropdown_create(main_windows);

    // 设置下拉列表选项
    lv_dropdown_set_options(list_obj, "Apple\n"
                                      "Banana\n"
                                      "Orange\n"
                                      "Cherry\n"
                                      "Grape\n"
                                      "Raspberry\n"
                                      "Melon\n"
                                      "Orange\n"
                                      "Lemon\n"
                                      "Nuts");

    lv_obj_align(list_obj, LV_ALIGN_CENTER, 290, -55);

    return true;
}

// 复选框
bool show_checkbox_demo(lv_obj_t *main_windows)
{
    lv_obj_t *check_apple = lv_checkbox_create(main_windows);
    lv_checkbox_set_text(check_apple, "apple"); // 设置复选框文本
    lv_obj_align(check_apple, LV_ALIGN_CENTER, 280, 40);
    lv_obj_add_event_cb(check_apple, check_press, LV_EVENT_ALL, NULL);

    lv_obj_t *check_banana = lv_checkbox_create(main_windows);
    lv_checkbox_set_text(check_banana, "banana");
    lv_obj_align(check_banana, LV_ALIGN_CENTER, 200, 40);
    lv_obj_add_event_cb(check_banana, check_press, LV_EVENT_ALL, NULL);

    return true;
}
void check_press(lv_event_t *e)
{
    // 获取触发状态
    lv_event_code_t code = lv_event_get_code(e);
    // 获取控件
    lv_obj_t *obj = lv_event_get_target(e);

    // 事件状态
    if (code == LV_EVENT_VALUE_CHANGED)
    {
        // 检查状态标志
        bool is_checked = lv_obj_has_state(obj, LV_STATE_CHECKED);
        char *state = is_checked ? "勾" : "没勾";
        const char *text = lv_checkbox_get_text(obj);

        printf("选择的复选框:%s 状态:%s\n", text, state);
    }
}

// 线条
bool show_line_demo(lv_obj_t *main_windows)
{

    // 创建一个线段对象
    static lv_point_t line_points[] = {{5, 5}, {70, 70}, {120, 10}, {180, 60}, {240, 10}};

    // 创建一个线段样式
    static lv_style_t style_line;
    lv_style_init(&style_line);
    lv_style_set_line_width(&style_line, 8);
    lv_style_set_line_color(&style_line, lv_palette_main(LV_PALETTE_BLUE));
    lv_style_set_line_rounded(&style_line, true); // 圆角

    lv_obj_t *line_obj = lv_line_create(main_windows);
    lv_line_set_points(line_obj, line_points, 5);
    lv_obj_add_style(line_obj, &style_line, 0);
    lv_obj_align(line_obj, LV_ALIGN_CENTER, 210, 160);

    return true;
}

// 圆弧
bool show_arc_demo(lv_obj_t *main_windows)
{
    lv_obj_t *arc = lv_arc_create(main_windows);
    lv_obj_set_size(arc, 150, 150);
    lv_arc_set_rotation(arc, 135);     // 旋转角度
    lv_arc_set_bg_angles(arc, 0, 270); // 背景角度
    lv_arc_set_value(arc, 40);         // 初始值
    lv_obj_align(arc, LV_ALIGN_CENTER, -300, -90);

    return true;
}

// 文本输入框
bool show_textarea_demo(lv_obj_t *main_windows)
{
    lv_obj_t *ta = lv_textarea_create(main_windows);
    lv_textarea_set_placeholder_text(ta, "TextArea"); // 占位符
    lv_textarea_set_one_line(ta, true);               // 单行
    lv_obj_align(ta, LV_ALIGN_CENTER, 265, 0);

    return true;
}

// label中文显示
bool show_label_demo(lv_obj_t *main_windows)
{
    // LV_FONT_DECLARE(lv_font_HeiTi_Bold_18_cjk); // 引入字体

    lv_obj_t *label_obj = lv_label_create(main_windows);
    lv_label_set_text(
        label_obj,
        "嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。");

    // 设置中文字体
    lv_obj_set_style_text_font(label_obj, &lv_font_simsun_16_cjk, 0);
    lv_obj_align(label_obj, LV_ALIGN_CENTER, 230, 80);
    lv_obj_set_width(label_obj, 290);

    return true;
}
bool show_label_demo2(lv_obj_t *main_windows)
{
    LV_FONT_DECLARE(lv_font_HeiTi_Bold_18_cjk); // 引入字体

    lv_obj_t *label_obj = lv_label_create(main_windows);
    lv_label_set_text(label_obj,
                      "长路漫漫,唯剑作伴\t剑之故事,以血为墨\t吾虽浪迹天涯,却未迷失本心\t此剑之势,愈斩愈烈\t");

    // 设置字体
    lv_label_set_long_mode(label_obj, LV_LABEL_LONG_SCROLL_CIRCULAR);
    lv_obj_set_style_text_font(label_obj, &lv_font_HeiTi_Bold_18_cjk, 0);
    lv_obj_set_style_text_color(label_obj, lv_color_make(255, 255, 255), LV_STATE_DEFAULT);
    lv_obj_align(label_obj, LV_ALIGN_CENTER, 0, -80);
    lv_obj_set_width(label_obj, 300);

    return true;
}

// 滚轮
bool show_roller_demo(lv_obj_t *main_windows)
{
    // 选项列表
    const char *opts = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10";

    lv_obj_t *roller_obj = lv_roller_create(main_windows);

    // 设置选项
    lv_roller_set_options(roller_obj, opts, LV_ROLLER_MODE_NORMAL);

    // 设置可见行
    lv_roller_set_visible_row_count(roller_obj, 3);

    // 对齐及位置
    lv_obj_align(roller_obj, LV_ALIGN_CENTER, 0, 70);

    return true;
}

// 列表
bool show_list_demo(lv_obj_t *main_windows)
{
    lv_obj_t *list_obj = lv_list_create(main_windows);
    lv_obj_set_size(list_obj, 200, 280);

    // lv_obj_set_style_text_font(list_obj, &lv_font_simsun_16_cjk, 0);

    // 创建列表按钮，并为每个按钮绑定点击事件和用户数据
    lv_obj_t *list_btn1 = lv_list_add_btn(list_obj, LV_SYMBOL_POWER, "POWER");
    lv_obj_add_event_cb(list_btn1, btn_event_cb, LV_EVENT_CLICKED, "POWER");

    lv_obj_t *list_btn2 = lv_list_add_btn(list_obj, LV_SYMBOL_DIRECTORY, "DIR");
    lv_obj_add_event_cb(list_btn2, btn_event_cb, LV_EVENT_CLICKED, "DIR");

    lv_obj_t *list_btn3 = lv_list_add_btn(list_obj, LV_SYMBOL_BLUETOOTH, "BLUETOOTH");
    lv_obj_add_event_cb(list_btn3, btn_event_cb, LV_EVENT_CLICKED, "BLUETOOTH");

    lv_obj_t *list_btn4 = lv_list_add_btn(list_obj, LV_SYMBOL_WIFI, "WiFi");
    lv_obj_add_event_cb(list_btn4, btn_event_cb, LV_EVENT_CLICKED, "WiFi");

    lv_obj_t *list_btn5 = lv_list_add_btn(list_obj, LV_SYMBOL_SETTINGS, "SETTINGS");
    lv_obj_add_event_cb(list_btn5, btn_event_cb, LV_EVENT_CLICKED, "SETTINGS");

    lv_obj_t *list_btn6 = lv_list_add_btn(list_obj, LV_SYMBOL_HOME, "HOME");
    lv_obj_add_event_cb(list_btn6, btn_event_cb, LV_EVENT_CLICKED, "HOME");

    return true;
}

// 事件处理回调函数
void btn_event_cb(lv_event_t *e)
{
    // 获取事件的用户数据，用户数据是绑定到事件的字符串
    const char *btn_text = (const char *)lv_event_get_user_data(e);
    // 打印按钮的文本
    printf("按下 %s\n", btn_text);
    if (strcmp(btn_text, "POWER") == 0)
    {
        // 获取事件目标对象的父对象，即画布（main_windows）
        lv_obj_t *main_windows = lv_obj_get_parent(lv_event_get_target(e));
        // 释放画布资源
        lv_obj_del(main_windows);
        printf("正在释放资源\n");
        exit_demo();
    }
    if (strcmp(btn_text, "DIR") == 0)
    {
        // 获取事件目标对象的父对象
        lv_obj_t *main_windows = lv_obj_get_parent(lv_event_get_target(e));

        // 释放画布资源
        lv_obj_del(main_windows);   // 释放画布资源
        lv_anim_del(NULL, NULL);    // 停止并删除所有动画
        lv_obj_clean(lv_scr_act()); // 清空屏幕

        printf("已释放资源并进入目录界面\n");
        show_dir_demo();
    }
}

// 目录界面
bool show_dir_demo()
{
    // 目录列表显示
    P_view_obj dir_obj = main_view();

    // 文件显示
    show_file_list(SEARCH_PATH, dir_obj);

    return true;
}

// 显示退出界面
bool exit_demo()
{
    lv_obj_t *main_windows = lv_obj_create(NULL);

    lv_obj_t *img2 = lv_img_create(main_windows);
    lv_img_set_src(img2, "S:/mdata/jpg/1.png");

    show_bar_exit(main_windows);

    lv_scr_load(main_windows);

    return true;
}

// 退出进度条
bool show_bar_exit(lv_obj_t *parent)
{
    /* 创建一个进度条对象 */
    lv_obj_t *bar_obj = lv_bar_create(parent);
    lv_obj_set_size(bar_obj, 700, 30);              // 进度条大小
    lv_obj_align(bar_obj, LV_ALIGN_CENTER, 0, 170); // 位置
    lv_bar_set_range(bar_obj, 0, 98);               // 范围

    /*  设置进度条的标签对象  */
    // 创建一个label对象
    lv_obj_t *label2 = lv_label_create(bar_obj);

    // 设置文字
    lv_label_set_text(label2, "正在退出...");
    lv_obj_set_style_text_font(label2, &lv_font_simsun_16_cjk, 0);
    lv_obj_set_style_text_color(label2, lv_color_make(0, 0, 0), LV_STATE_DEFAULT);
    lv_obj_center(label2); // 居中

    /* 设置动画 */
    lv_anim_t a;
    lv_anim_init(&a);
    lv_anim_set_exec_cb(&a, bar_exit_val); // 动画执行回调函数
    lv_anim_set_time(&a, 6000);            // 持续时间
    lv_anim_set_var(&a, bar_obj);          // 动画对象
    lv_anim_set_values(&a, 0, 100);        // 起始值和结束值
    lv_anim_set_repeat_count(&a, 1);       // 重复次数
    lv_anim_start(&a);                     // 开始动画

    return true;
}

// 更新进度条以及退出程序
void bar_exit_val(void *bar, int32_t value)
{
    lv_bar_set_value(bar, value, LV_ANIM_ON);
    // 当进度条的值到100,设置退出标志为真
    if (value == 100)
    {
        exit_flag = true;
        printf("进度条完成，准备退出程序\n");
    }
}